#include "filtreprefixe.h"


filtreprefixe::filtreprefixe() : tbb::filter(serial_in_order) {
	
}


filtreprefixe::filtreprefixe(result *resultat_final) : tbb::filter(serial_in_order) {
	i =0;
	result_final = resultat_final;
//	j =0;
}


filtreprefixe::~filtreprefixe(){

	tableau_sufixe.~concurrent_vector();
}

void* filtreprefixe::operator ()(void *vector_int ){
	if( vector_int == NULL)
	{
		return NULL;
	}
	else
	{
//		std::cout<< " debut du calcul tableau"<< std::endl;
		std::vector<int> *ligne_recu = static_cast< std::vector<int>* >(vector_int);
		
		if(i ==0)
		{
			std::vector<int> v( (*(ligne_recu)).size(), 0);
			this->tableau_sufixe.push_back(v);
		
		}

		this->tableau_sufixe.push_back( *ligne_recu );
	//	std::cout<<" tableau push back"<<std::endl;


		int k =  this->tableau_sufixe.size();
	//	for(int j = (k -1); j > 0; j--)
	//	{

		//	std::cout<<std::endl;
	//	}
	
		tbb::parallel_for(int(0),int(k),[=](int j) {fonction_parallel(j,k,ligne_recu);});

			
		i++;
		return NULL;
	}
}
int filtreprefixe::fonction_parallel(int j,int k,std::vector<int> *ligne_recu)
	{	
		std::vector<int> Cgh( (*(ligne_recu)).size() , 0);
		for(int l = 0; l < (this->tableau_sufixe[j].size()) ; l++)
		{
			Cgh[l] = this->tableau_sufixe[k-1][l] - this->tableau_sufixe[j][l];
		//	std::cout<< Cgh[l]<<" ";
		}
		//	std::cout<<std::endl;
		calcule& calc = *new(tbb::task::allocate_root()) calcule(&Cgh,j,k-2,result_final);
		tbb::task::spawn_root_and_wait(calc);

		return 0;
	}






